<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>Overview</title>

 </head>
 <body><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="intro.mysqli.html">简介</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="mysqli.quickstart.html">Quick start guide</a></div>
 <div class="up"><a href="book.mysqli.html">Mysqli</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div><hr /><div id="mysqli.overview" class="chapter">

  <h1>Overview</h1>


  <p class="para">
  这一部分对在PHP应用开发过程中需要和Mysql数据库交互时可用的选择进行一个简单介绍。
  </p>

  <p class="para">
    <em class="emphasis">什么是API?</em>
  </p>

  <p class="para">
  一个应用程序接口（Application Programming Interface的缩写），定义了类，方法，函数，变量等等一切
  你的应用程序中为了完成特定任务而需要调用的内容。在PHP应用程序需要和数据库进行交互的时候所需要的API
  通常是通过PHP扩展暴露出来（给终端PHP程序员调用）。
  </p>

  <p class="para">
  API可以是面向过程的，也可以是面向对象的。对于面向过程的API，我们通过调用函数来完成任务，而对于面向对象的API，
  我们实例化类，并在实例化后得到的对象上调用方法。对于这两种接口而言，后者通常是首选的，因为它更加现代化，并且
  给我们带来了良好的代码结构。
  </p>

  <p class="para">
  当构建一个需要连接到MySQL服务端的PHP应用的时候，有好几种API可供选择。此文档就是讨论这些可用的API并讨论如何为
  你的应用选择一个最佳的解决方案。
  </p>

  <p class="para">
    <em class="emphasis">什么是连接器?</em>
  </p>

  <p class="para">
  在MySQL文档中，术语<em class="emphasis">connector</em>解释为“一段允许你的应用连接到MySQL数据库服务器的软件代码”。
  MySQL提供了很多语言的连接器，其中包括PHP的。
  </p>

  <p class="para">
  在你的PHP应用需要和一个数据库服务器交互的时候，你需要书写PHP代码去完成“连接数据库服务器”，“查询数据库“以及其他数据库相关功能
  等一系列活动。你的PHP应用将会使用提供这些API的软件，或者在需要的时候使用一些中间库，来处理你的应用和数据库服务器之间的交互。
  这种软件通常被认为是连接器，它允许你的引用<em class="emphasis">连接</em>到数据库服务器。
  </p>

  <p class="para">
    <em class="emphasis">什么是驱动?</em>
  </p>

  <p class="para">
  驱动是一段设计用来于一种特定类型的数据库服务器进行交互的软件代码。驱动可能会调用一些库，比如MySQL客户端库或者MySQL Native驱动库。
  这些库实现了用于和MySQL数据库服务器进行交互的底层协议。
  </p>

  <p class="para">
  通过一个例子<a href="mysqli.overview.html#mysqli.overview.pdo" class="link">PDO(PHP Database Object的缩写)</a>数据库抽象层可以
  使用多种特定数据库的驱动。其中一种驱动就是PDO MYSQL驱动，它就是与MySQL服务器之间的接口。
  </p>

  <p class="para">
  有时大家会不加区分的使用连接器和驱动这两个术语。在MySQL相关文档中"<span class="quote">driver</span>"术语被作为一个连接器包
  中提供特定数据库部分的软件代码。
  </p>

  <p class="para">
    <em class="emphasis">什么是扩展?</em>
  </p>

  <p class="para">
  在PHP文档中你还会发现很多其他的<em class="emphasis">扩展</em>。PHP代码是由一个核心，一些可选扩展组成了核心功能。PHP
  的MySQL相关扩展，比如<em>mysqli</em>，<em>mysql</em>都是基于PHP扩展框架实现的。
  </p>

  <p class="para">
  扩展一个典型的作用就是暴露一个API给PHP程序员，允许扩展自己的功能可以被程序员使用。当然，也有一部分基于PHP扩展框架
  开发的扩展不会给PHP程序员暴露API接口。
  </p>

  <p class="para">
  比如说PDO MySQL驱动扩展，就没有向PHP程序员暴露API接口，但是向它上层的PDO层提供了一个接口。
  </p>

  <p class="para">
  术语API和扩展描述的不是同一类事物，因为扩展可能并不需要暴露一个API接口给程序员。
  </p>

  <p class="para">
    <em class="emphasis">PHP中提供的用于MySQL的主要API是什么？</em>
  </p>

  <p class="para">
  当考虑连接到MySQL数据库服务器的时候，有三种主要的API可供选择：
  </p>

  <ul class="itemizedlist">

    <li class="listitem">
      <p class="para">
        PHP的MySQL扩展
      </p>
    </li>

    <li class="listitem">
      <p class="para">
      PHP的mysqli扩展
      </p>
    </li>

    <li class="listitem">
      <p class="para">
      PHP数据对象(PDO)
      </p>
    </li>

  </ul>

  <p class="para">
  三者都有各自的优缺点。下面的讨论就是为了对每种API的关键方面给出一个简短的介绍。
  </p>

  <p class="para">
    <em class="emphasis">什么是PHP的MySQL扩展?</em>
  </p>

  <p class="para">
  这是设计开发允许PHP应用与MySQL数据库交互的早期扩展。<em>mysql</em>扩展提供了一个面向过程
  的接口，并且是针对MySQL4.1.3或更早版本设计的。因此，这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端
  进行交互，但并不支持后期MySQL服务端提供的一些特性。
  </p>

  <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
    如果你是使用MySQL4.1.3或更新的服务端版本，<em class="emphasis">强烈</em>建议你使用<em>mysqli</em>
    扩展替代它。
    </p>
  </p></blockquote>

  <p class="para">
  <em>mysql</em>扩展的源代码在PHP扩展目录<var class="filename">ext/mysql</var>下。
  </p>

  <p class="para">
  对于<em>mysql</em>扩展的更多信息，请参阅<a href="book.mysql.html" class="xref">Mysql</a>。
  </p>

  <p class="para">
    <em class="emphasis">什么是PHP的mysqli扩展?</em>
  </p>

  <p class="para">
  <em>mysqli</em>扩展，我们有时称之为MySQL<em class="emphasis">增强</em>扩展，可以用于使用
  MySQL4.1.3或更新版本中新的高级特性。<em>mysqli</em>扩展在PHP 5及以后版本中包含。
  </p>

  <p class="para">
  <em>mysqli</em>扩展有一系列的优势，相对于<em>mysql</em>扩展的提升主要有：
    <ul class="itemizedlist">

      <li class="listitem">
        <p class="para">
          面向对象接口
        </p>
      </li>

      <li class="listitem">
        <p class="para">
          prepared语句支持（译注：关于prepare请参阅mysql相关文档）
        </p>
      </li>

      <li class="listitem">
        <p class="para">
          多语句执行支持
        </p>
      </li>

      <li class="listitem">
        <p class="para">
          事务支持
        </p>
      </li>

      <li class="listitem">
        <p class="para">
          增强的调试能力
        </p>
      </li>

      <li class="listitem">
        <p class="para">
          嵌入式服务支持
        </p>
      </li>

    </ul>
  </p>

  <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
    如果你使用MySQL4.1.3或更新版本，<em class="emphasis">强烈</em>建议你使用这个扩展。
    </p>
  </p></blockquote>

  <p class="para">
  在提供了面向对象接口的同时也提供了一个面向过程的接口。
  </p>

  <p class="para">
  <em>mysqli</em>扩展是使用PHP扩展框架构建的，它的源代码在PHP源码目录下的<var class="filename">ext/mysqli</var>中。
  </p>

  <p class="para">
  对于<em>mysqli</em>扩展的更多信息，请参阅<a href="book.mysqli.html" class="xref">Mysqli</a>。
  </p>

  <p class="para" id="mysqli.overview.pdo">
    <em class="emphasis">什么是PDO?</em>
  </p>

  <p class="para">
  PHP数据对象，是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以使得你的PHP应用不去关心具体要
  连接的数据库服务器系统类型。也就是说，如果你使用PDO的API，可以在任何需要的时候无缝切换数据库服务器，比如从Firebird
  到MySQL，仅仅需要修改很少的PHP代码。
  </p>

  <p class="para">
  其他数据库抽象层的例子包括Java应用中的JDBC以及Perl中的DBI。
  </p>

  <p class="para">
  当然，PDO也有它自己的先进性，比如一个干净的，简单的，可移植的API，它最主要的缺点是会限制让你不能使用
  后期MySQL服务端提供所有的数据库高级特性。比如，PDO不允许使用MySQL支持的多语句执行。
  </p>

  <p class="para">
  PDO是基于PHP扩展框架实现的，它的源码在PHP源码目录的<var class="filename">ext/pdo</var>下。
  </p>

  <p class="para">
    PDO的更多信息，请参阅<a href="book.pdo.html" class="xref">PDO</a>。
  </p>

  <p class="para">
    <em class="emphasis">什么是PDO的MySQL驱动器?</em>
  </p>

  <p class="para">
  PDO的MySQL驱动并不是一套API，至少从PHP程序员的角度来看是这样的。实际上，PDO的MySQL驱动处于PDO自己的下层，
  提供了特定的Mysql功能。程序员直接调用PDO的API，而PDO使用了PDO的MySQL驱动完成与MySQL服务器端的交互。
  </p>

  <p class="para">
  PDO的MySQL驱动是众多PDO驱动中的一个。其他可用的PDO驱动包括Firebird，PostgreSQL等等。
  </p>

  <p class="para">
  PDO的MySQL驱动是基于PHP扩展框架实现的。它的源码在PHP源码目录下的<var class="filename">ext/pdo_mysql</var>。
  它没有向PHP程序员暴露API。
  </p>

  <p class="para">
    PDO的MySQL扩展的更多信息请参阅<a href="ref.pdo-mysql.html" class="xref">MySQL (PDO)</a>。
  </p>

  <p class="para" id="mysqli.overview.mysqlnd">
    <em class="emphasis">什么是PHP的MySQL Native 驱动?</em>
  </p>

  <p class="para">
  为了与MySQL数据库服务端进行交互，<em>mysql</em>扩展，<em>mysqli</em>扩展，
  PDO MySQL驱动都使用了实现了必要的协议的底层库。以前，可用的库只有MySQL客户端库和<em>libmysql</em>。
  </p>

  <p class="para">
  然而，<em>libmysql</em>包含的接口没有针对与PHP的应用交互进行优化，<em>libmysql</em>
  是早期为C应用程序设计的。基于这个原因，MySQL Native驱动<em>mysqlnd</em>，作为<em>libmysql</em>的一个
  针对PHP应用的修改版本被开发。
  </p>

  <p class="para">
  <em>mysql</em>，<em>mysqli</em>以及PDO Mysql驱动都可以各自配置使用
  <em>libmysql</em>或者<em>mysqlnd</em>。<em>mysqlnd</em>作为一个专门设计
  用于PHP系统的库，它在内存和速度上都比<em>libmysql</em>有很大提升。非常希望你去尝试这些提升。
  </p>

  <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
    MySQL Native驱动仅仅可以在MySQL服务端版本为4.1.3及以后版本才可以使用。
    </p>
  </p></blockquote>

  <p class="para">
  MySQL Native驱动是基于PHP扩展框架实现的。源代码位于PHP源码目录的<var class="filename">ext/mysqlnd</var>下。
  它没有向PHP程序员暴露接口。
  </p>



  <p class="para">
    <em class="emphasis">特性比较</em>
  </p>

  <p class="para">
  下表比较了PHP中三种主要的MySQL连接方式的功能：
  </p>

  <table class="doctable informaltable">
    
      <col width="25*" />
      <col width="25*" />
      <col width="25*" />
      <col width="25*" />
      <thead>
        <tr>
          <th class="empty">&nbsp;</th>
          <th>PHP的mysqli扩展</th>
          <th>PDO (使用PDO MySQL驱动和MySQL Native驱动)</th>
          <th>PHP的mysql扩展</th>
        </tr>

      </thead>

      <tbody class="tbody">
        <tr>
          <td>引入的PHP版本</td>
          <td>5.0</td>
          <td>5.0</td>
          <td>3.0之前</td>
        </tr>

        <tr>
          <td>PHP5.x是否包含</td>
          <td>是</td>
          <td>是</td>
          <td>是</td>
        </tr>

        <tr>
          <td>MySQL开发状态</td>
          <td>活跃</td>
          <td>在PHP5.3中活跃</td>
          <td>仅维护</td>
        </tr>

        <tr>
          <td>在MySQL新项目中的建议使用程度</td>
          <td>建议 - 首选</td>
          <td>建议</td>
          <td>不建议</td>
        </tr>

        <tr>
          <td>API的字符集支持</td>
          <td>是</td>
          <td>是</td>
          <td>否</td>
        </tr>

        <tr>
          <td>服务端prepare语句的支持情况</td>
          <td>是</td>
          <td>是</td>
          <td>否</td>
        </tr>

        <tr>
          <td>客户端prepare语句的支持情况</td>
          <td>否</td>
          <td>是</td>
          <td>否</td>
        </tr>

        <tr>
          <td>存储过程支持情况</td>
          <td>是</td>
          <td>是</td>
          <td>否</td>
        </tr>

        <tr>
          <td>多语句执行支持情况</td>
          <td>是</td>
          <td>大多数</td>
          <td>否</td>
        </tr>

        <tr>
          <td>是否支持所有MySQL4.1以上功能</td>
          <td>是</td>
          <td>大多数</td>
          <td>否</td>
        </tr>

      </tbody>
    
  </table>


</div>
<hr /><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="intro.mysqli.html">简介</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="mysqli.quickstart.html">Quick start guide</a></div>
 <div class="up"><a href="book.mysqli.html">Mysqli</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div></body></html>
